Skip to content

feat: cierra los huecos de Java, C# y Angular en el kit - #17

Merged
lacasoft merged 1 commit into
masterfrom
feat/java-csharp-angular
Aug 17, 2026
Merged

lacasoft merged 1 commit into
masterfrom
feat/java-csharp-angular

Conversation

@lacasoft

Copy link
Copy Markdown
Owner

Pediste soporte para Java, C# y Angular. Los tres stacks ya existían — backend/spring, backend/dotnet y frontend/angular, con detección funcionando — pero al revisarlos encontré huecos reales alrededor, y eso es lo que cierra este PR.

Probablemente no aparecían porque hasta el PR #15 el árbol del README listaba backend/{_common,nestjs,fastapi,php} y se comía spring y dotnet.

C# no tenía estándares de lenguaje

coder.md cubría TypeScript, Python, Go, Rust, Solidity, PHP, Java y Dart. C# no, pese a existir un stack backend/dotnet entero y a que la propia regla de nombres del agente ya lo mencionaba (camelCase (TS/JS/Java/C#/Dart)). Un proyecto .NET recibía el overlay del stack pero ninguna guía de lenguaje.

Se añade su sección —nullable reference types y el ! como lo que es, record/sealed, async sin .Result/async void, CancellationToken propagado, excepciones específicas, analyzers como error— y se incluye C# en la lista de lenguajes del agente.

La detección de Spring se dejaba casos

Se exigía la cadena literal spring-boot en el pom.xml. Lo verifiqué ejecutando el predicado viejo caso por caso:

Caso Antes Ahora
pom.xml con spring-boot-starter ✅ ✅
pom.xml solo con org.springframework (BOM, Framework sin Boot) ❌ ✅
build.gradle.kts con el plugin ✅ ✅
build.gradle con io.spring.dependency-management ✅ ✅
settings.gradle(.kts) ❌ (ni se miraba) ✅

Los dos que ya funcionaban quedan como guardas de regresión, etiquetados como tales en el test — no los presento como arreglos.

Java sin Spring ya no es un callejón sin salida

La detección devolvía null sin explicar nada y, con --yes, el instalador salía con código 1 a secas. Ahora imprime qué vio:

🔍 Vi pom.xml: es un proyecto Java/Kotlin, pero no encontré señales de Spring.
   El overlay de Java del kit es Spring Boot; úsalo con --stack backend/spring si aplica.
   Si es Quarkus, Micronaut o Jakarta EE puro, ese overlay no encaja: dinos cuál necesitas.

Misma pista para Go, Rust y para un package.json sin framework reconocido. Deliberadamente no fuerzo un proyecto Quarkus al overlay de Spring: le daría consejos que no aplican. Soporte real de Quarkus/Micronaut son stacks nuevos, que es trabajo aparte.

Overlays más profundos

Overlay Antes Ahora Qué entra
backend/spring 25 40 Virtual threads (Java 21), @Async con executor explícito, Resilience4j, @Cacheable con clave y TTL, Actuator + Micrometer, readOnly en lecturas, la trampa del proxy de @Transactional en llamadas internas, slices de test frente a @SpringBootTest
backend/dotnet 26 44 CancellationToken propagado, IHttpClientFactory con typed clients y resiliencia, HybridCache, OpenTelemetry, health checks, MapGroup con filtros, la captura de Scoped desde Singleton, Nullable/TreatWarningsAsErrors, ConfigureTestServices
frontend/angular 26 47 @defer, computed frente a effect, linkedSignal, rutas lazy con guards funcionales y withComponentInputBinding, interceptores funcionales, formularios reactivos tipados, NgOptimizedImage, accesibilidad, presupuestos de bundle

Sobre las APIs resource/rxResource/httpResource de Angular dejo escrito que confirmes su nivel de estabilidad contra la versión exacta del proyecto, en vez de afirmarlo yo: su estado ha ido cambiando entre versiones.

Test plan

  • node --test — 51 tests, 10 nuevos de detección: las cinco variantes de Spring, Java sin Spring (no se marca como Spring, explica por qué y sale con código 1), .csproj, angular.json, @angular/core, y las pistas de Go/Rust
  • Verificado el predicado viejo caso por caso para no presentar como arreglo algo que ya funcionaba — de ahí que dos filas de la tabla salgan ✅/✅
  • node scripts/validate.cjs — 49 comprobaciones (incluye el check es-MX sobre los overlays)
  • Smoke test del CI replicado en local: 13 stacks en verde

Los tres stacks ya existían (backend/spring, backend/dotnet,
frontend/angular), pero tenían huecos reales alrededor.

Added:
- Estándares de C# en el agente coder. 'Estándares por lenguaje' cubría
  TypeScript, Python, Go, Rust, Solidity, PHP, Java y Dart, pero no C#, pese a
  existir un stack backend/dotnet completo y a que la regla de nombres ya lo
  mencionaba. Un proyecto .NET recibía el overlay del stack pero ninguna guía
  de lenguaje.
- Overlays de Spring (25→40), .NET (26→44) y Angular (26→47) profundizados con
  concurrencia, resiliencia, caché, observabilidad y calidad de proyecto.

Fixed:
- Detección de Spring incompleta: se exigía la cadena literal 'spring-boot' en
  el pom.xml, así que un proyecto que solo declara org.springframework (BOM o
  Spring Framework sin Boot) no se detectaba; y los settings.gradle(.kts) no se
  miraban. Los casos de build.gradle(.kts) sí funcionaban ya y quedan cubiertos
  como guardas de regresión.
- Un proyecto Java sin Spring quedaba en un callejón sin salida: la detección
  devolvía null sin explicar nada. Ahora se imprime qué se vio y se aclara que
  el overlay de Java del kit es Spring Boot, avisando de que para Quarkus,
  Micronaut o Jakarta EE puro no encaja.

Tests: 51 (10 nuevos de detección).
@lacasoft
lacasoft merged commit 88584eb into master Aug 17, 2026
1 check passed
@lacasoft

Copy link
Copy Markdown
Owner Author

Añadido: la detección ya no exige que el manifiesto esté en la raíz

Instalar el kit en un proyecto C# real destapó un fallo mayor que los de este PR: la detección solo miraba la raíz del repo. Con PruebaConteo/PruebaConteo.csproj había que pasar --stack backend/dotnet a mano, y en .NET ese layout no es una rareza — es el normal (Proyecto/Proyecto.csproj, src/App/App.csproj).

Cómo queda

Las reglas se factorizan a detectIn(dir), parametrizado por directorio, y detectStack() las aplica primero a la raíz y, solo si ahí no hay nada, a los subdirectorios en anchura: 3 niveles, tope de 250 directorios, saltando node_modules, bin, obj, target, dist, packages…

La raíz mantiene prioridad absoluta, así que ningún proyecto que ya se detectaba cambia de resultado — hay un test que lo fija.

packages/ se salta a propósito: en un monorepo, elegir un paquete al azar sería peor que pedir --stack.

Auditable, no un acto de fe

✅ Stack detectado: backend/dotnet (por PruebaConteo/, no por la raíz)
   El kit se instala aquí, en testC2/, para que el CLAUDE.md cubra todo el repo.

Esa segunda línea responde justo la duda que se plantea al instalar en la raíz teniendo el proyecto en un subdirectorio.

Verificación

Caso Resultado
PruebaConteo/PruebaConteo.csproj (el caso real) backend/dotnet (por PruebaConteo/)
src/App/App.csproj backend/dotnet (por src/App/)
.sln en raíz backend/dotnet (sin cambio)
backend/pom.xml con Spring backend/spring (por backend/)
web/angular.json frontend/angular (por web/)
Raíz NestJS + sub/Legacy.csproj backend/nestjs — la raíz gana
obj/Debug/generado.csproj, node_modules/x/angular.json no detecta: son artefactos

Costo: 156 ms en un repo hostil de 422 directorios sin nada detectable — y solo se paga cuando la raíz no resuelve.

Tests: 51 → 56.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant